package com.area.service.impl;

import com.area.entity.Producttype;
import com.area.mapper.ProducttypeMapper;
import com.area.service.IProducttypeService;
import com.code.util.Variable;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类 分类管理
 * </p>
 *
 * @author guanfenga@yonyou.com
 * @since 2023-01-09
 */
//业务层，一般对于接口和实现
@Service
//注解式事务
@Transactional
@Slf4j
public class ProducttypeServiceImpl extends ServiceImpl<ProducttypeMapper, Producttype> implements IProducttypeService {

    /**
     * 自动注入依赖
     * @Resource bean的注入，同Autowired 有相同的功能。
     * 说明：
     * 	共同点：@Resource和@Autowired都可以作为注入属性的修饰，在接口仅有单一实现类时，两个注解的修饰效果相同，可以互相替换，不影响使用。
     * 	不同点：
     * 	@Resource是Java自己的注解，@Resource有两个属性是比较重要的，分别是name和type；
         * 	Spring将@Resource注解的name属性解析为bean的名字，而type属性则解析为bean的类型。
         * 	所以如果使用name属性，则使用byName的自动注入策略，而使用type属性时则使用byType自动注入策略。
         * 	如果既不指定name也不指定type属性，这时将通过反射机制使用byName自动注入策略。
     * 	@Autowired是spring的注解，是spring2.5版本引入的，Autowired只根据type进行注入，不会去匹配name。
        * 	如果涉及到type无法辨别注入对象时，那需要依赖@Qualifier或@Primary注解一起来修饰。
     */
    @Autowired
    private ProducttypeMapper producttypeMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<Producttype> queryProductTypeAll(Producttype producttype) {
        // 用于清除缓存 原因是手动修改数据库图片所以需要进行该操作
        // redisTemplate.delete("productTypeList");
        //判断redis
        List<Producttype> producttypeList = producttypeMapper.queryProductTypeAll(producttype);
        if (!producttypeList.isEmpty()){
            producttypeList = getRecursion(0);
        }
        return producttypeList ;

    }
    /**
     * 递归方法
     * @param productTypeId
     * @return
     */
    private List<Producttype> getRecursion(Integer productTypeId){
        //根据父id查询子
        List<Producttype> productTypeList =  producttypeMapper.queryProductTypeParentId(productTypeId);
        //定义新的list
        if(!productTypeList.isEmpty()){ //不为null
            productTypeList =  productTypeList.stream().filter(producttype -> {
                producttype.setChildren(getRecursion(producttype.getProductTypeId()));
                producttype.setValue(producttype.getSortName());
                producttype.setTitle(producttype.getSortName());
                producttype.setKey(producttype.getProductTypeId());
                return true;
            }).collect(Collectors.toList());
        }
        return productTypeList;
    }

}
